package com.example.anwserai.demos.web.util;


import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.example.anwserai.demos.web.entity.DocumentAnalysisResult;
import com.example.anwserai.demos.web.service.AIServiceImpl;
import lombok.extern.slf4j.Slf4j;
import okhttp3.OkHttpClient;
import org.springframework.http.HttpEntity;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpMethod;
import org.springframework.http.client.OkHttp3ClientHttpRequestFactory;
import org.springframework.util.StringUtils;
import org.springframework.web.client.RestTemplate;

import java.io.File;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.TimeUnit;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

@Slf4j
public class QwenApiUtilQ40317 {

    private static final RestTemplate restTemplate = restTemplateByOkHttp();

    //private static String API_KEY = "cfa686ec-894b-4603-a76d-368984412534";
    //private static String MODEL = "Qwen2.5-72B-Instruct-W8A8";
    //private static String API_URL = "http://192.168.255.25:20000/v1/chat/completions";

    private static String API_KEY = "sk-b84a7192f4d64f208720f09a363da791";
    private static String MODEL = "qwen-plus";
    private static String API_URL = "https://dashscope.aliyuncs.com/compatible-mode/v1/chat/completions";

    public static void setConfig(String newApiKey, String newModel, String newApiUrl) {
        API_KEY = newApiKey;
        MODEL = newModel;
        API_URL = newApiUrl;
    }
    // 需求4
    private static final String ask_message ="### 角色\n" +
            "你是一个专业的政府部门文员秘书，擅长各类公文的审核。\n" +
            "\n" +
            "### 背景\n" +
            "政府某部门常年会发出各类公文，公文质量参差不齐，存在各种问题，现在上级要求对公文的质量进行审核，并对各种质量问题进行总结。\n" +
            "\n" +
            "### 任务要求\n" +
            "1.分析输入的公文内容，判断存在的质量问题。\n" +
            "2.如果为格式质量问题，需要定位问题所在的开始字符位置与结束字符位置。\n" +
            "3.提取发文标题等信息。\n" +
            "\n" +
            "### 处理规则\n" +
            "1.文稿篇幅是否合规\n" +
            "2.如有的字段在会议通知内容中未找出，则该字段返回'未涉及'。\n" +
            "\n" +
            "### 输出格式\n" +
            "1.返回数据格式请以标准的json格式，每个字段的值为字符串类型，不要包含额外内容。\n" +
            "2.返回json字段及处理要求：\n" +
            /*"  - fileContent：正文内容。提取正文内容，排除页眉、页脚、标题、抬头和表格。\n" +*/
            /*"  - errorcontent：出错位置。定位规则：检测正文文本中的错别字，并返回共有多少错别字，且每个错别字的位置信息。输出示例：'文中一共存在两个错别字。第一个错别词为《拟好》；第二个错别词为《步尸霸》。\n" +*/
            "  - doc_title：发文标题。定位规则：从文本开头提取首个以显著标识（如单独成行的###、加粗或居中）开头的主标题，排除附件名称。输出示例：'关于...的通知'；标题一般会包含'关于'前缀及'通知''决定'等文种词，有的公文标题有多行(在'关于'前的文本也可能是标题。要求完整保留。\n" +
            "  - is_length_Compliance：文稿篇幅是否合规。对正文字数进行判断，检查正文字数是否超过4000字，低于4000字返回结果'文章篇幅合规'。高于4000字的文件注意点：\n" +
            "     - 如果文件中标题和正文部分中包含“全局性”、“综合性”、“整体性”的文件，其正文部分字数低于5000字返回结果'文章篇幅合规'。\n" +
            "\t - 其他情况统计正文字数，返回'正文部分字数为6399字，建议缩短篇幅'。\n" +
            "  - is_completion_level：附件完齐程度。判断文件是否具有以下附件：发文说明、征求意见情况、定密（密级和保密期限）审核表、发文依据文件、风险评估报告、公平竞争审查意见、合法性审核意见。涉及会议活动的应附具会议活动方案、背景资料要件材料。并将缺失文档标明。输出示例：“附件完齐”，“附件不齐全，缺失发文说明”。\n" +
            "  - accuracy_information：信息准确程度。判断文件是否有无常识性错误，无错字、多字、别字、漏字；引用人名、职务、地名、机构名、事件、时间、数字、引文、文号等信息准确；序号、页码排列准确。错别字用《》标识出来。输出示例：'信息不准确。文中一共存在两个错别字。第一个错别词为《拟好》；第二个错别词为《步尸霸》;；'。\n" +
            "  - is_Complete_elements: 要素是否齐全。判断文件中版头、主体、版记等公文各要素是否完整规范；判断文字、数字、计量单位和标点符号等用法是否符合规范。并将标明不符合地方\"+\"输出示例：“要素不齐全，标点符号使用错误。\n" +
            "  - is_meet_requirements：满足条例规定。判断文件是否文种使用正确,发文规格合适,公文格式规范。并将标明不规范地方\"+\"输出示例：“文种使用正确。\n" +
            "  - is_unity_coherence：文理是否通顺。判断文件是否主题鲜明、标题清晰。并将标明不规范地方\"+\"输出示例：“文理通顺”。\n" +
            "\n" +
            "### 输出样例：\n" +
            "  - \"doc_title\": \"关于做好全市高层民用建筑消防设施隐患排查整治及城镇消防站规划建设工作督导检查发现问题整改工作的通知\",\n" +
            "  - \"is_length_Compliance\": \"文章篇幅合规\"\n" +
            /*"  - \"fileContent\": \"近期，市小芳暗拳委员会组成4个督导检查组，对全市高层民用建筑消防设施隐患排查整治专项行动及城镇消防站规划建设工作开展情况进行了督导检查，市消防、公安、住建、城管等部门和市政府督查室参与督导。\"\n" +*/
            /*"  -\"errorcontent\": \"文中一共存在两个错别字。一个错别词为《拟好》；第二个错别词为《步尸霸》。\"\n" +*/
            "  -\"accuracy_information\": \"信息不准确。文中一共存在两个错别字。第一个错别词为《拟好》；第二个错别词为《步尸霸》;\"\n" +
            "  -\"is_completion_level\": \"附件不齐全，缺失发文说明、征求意见情况、定密（密级和保密期限）审核表、发文依据文件、风险评估报告、公平竞争审查意见、合法性审核意见等发文要件。\"\n" +
            "  -\"is_Complete_elements\": \"要素齐全\"\n" +
            "  -\"is_meet_requirements\": \"文种使用正确\",\n" +
            "  -\"is_unity_coherence\": \"文理通顺\"";


    // 需求2：请求AI
    public static String analyzeNotice(String noticeContent) {
        try {
            // 1. 构建请求体（使用Fastjson序列化）
            JSONObject requestBody = new JSONObject();
            requestBody.put("model", MODEL);
            requestBody.put("temperature", 0.1);


            JSONArray messages = new JSONArray();
            messages.add(new JSONObject()
                    .fluentPut("role", "system")
                    .fluentPut("content", ask_message));

            messages.add(new JSONObject()
                    .fluentPut("role", "user")
                    .fluentPut("content", "请分析以下督察通知：\n" + noticeContent));

            requestBody.put("messages", messages);


            HttpHeaders httpHeaders = new HttpHeaders();
            httpHeaders.add("Content-Type", "application/json");
            httpHeaders.add("Authorization", "Bearer " + API_KEY);

            HttpEntity<String> entity = new HttpEntity<>(requestBody.toString(), httpHeaders);
            return restTemplate.exchange(API_URL, HttpMethod.POST, entity, String.class).getBody();
        } catch (Exception e) {
            log.error("请求ai过程中出错", e);
            throw new RuntimeException("请求ai过程中出错");
        }
    }

    public static DocumentAnalysisResult getContent(String message, File file) {
        try {
            if (!StringUtils.hasLength(message)) {
                throw new RuntimeException("提取结果为空");
            }
            JSONObject respJson = JSON.parseObject(message);
            JSONArray choices = respJson.getJSONArray("choices");
            String content = choices.getJSONObject(0)
                    .getJSONObject("message")
                    .getString("content");
            content = content.replaceAll("```[a-zA-Z]*\\n|```", "");
            // 将 content 字符串解析为 JSON 对象

			// 找到 `}` 的位置
			int endIndex = content.indexOf('}');

			// 截取 `}` 之前的数据
            String result = content.substring(0, endIndex + 1); // 包含 `}`

			System.out.println("content:::::"+result);
            // 查找 `}` 的位置

            JSONObject contentJson = JSON.parseObject(result);

            // 提取字段 TODO


            /*String fileContent = contentJson.getString("fileContent");*/
            String fileContent = AIServiceImpl.read(file);
            long startTime = System.currentTimeMillis();
            //JSONArray errorcontent = extractTypoPositions(fileContent,contentJson.getString("errorcontent"));
            JSONArray errorcontent = extractTypoPositions(fileContent,contentJson.getString("accuracy_information"));
            /*Thread.sleep(2000);*/
            long endTime = System.currentTimeMillis();
            // 计算执行时长
            long duration = endTime - startTime;
            System.out.println("代码执行时长：" + duration + " 毫秒");

            System.out.println("bb  ：：："+errorcontent);
            String docTitle = contentJson.getString("doc_title");
            String islengthcompliance = contentJson.getString("is_length_Compliance");
            String accuracyinformation = contentJson.getString("accuracy_information");
            String isCompleteelements = contentJson.getString("is_Complete_elements");
            String ismeetrequirements = contentJson.getString("is_meet_requirements");
            String iscompletionlevel = contentJson.getString("is_completion_level");
            String isunitycoherence = contentJson.getString("is_unity_coherence");

            // 构建 SupervisionResult 对象 TODO
            //return new DocumentAnalysisResult(docTitle, islengthcompliance,iscompletionlevel);

            DocumentAnalysisResult documentAnalysisResult =  new DocumentAnalysisResult(fileContent,errorcontent,docTitle, islengthcompliance,iscompletionlevel,accuracyinformation,isCompleteelements,ismeetrequirements,isunitycoherence);
            System.out.println("documentAnalysisResult::"+documentAnalysisResult.getErrorcontent().toString());
            return documentAnalysisResult;
        } catch (Exception e) {
            log.error("ai提取结果转换json过程中出错", e);
            throw new RuntimeException("ai提取结果转换json过程中出错");
        }
    }

    public static RestTemplate restTemplateByOkHttp() {
        // 配置 OkHttpClient 超时
        OkHttpClient okHttpClient = new OkHttpClient.Builder()
                .connectTimeout(5, TimeUnit.MINUTES) // 连接超时
                .readTimeout(5, TimeUnit.MINUTES)    // 读取超时
                .writeTimeout(5, TimeUnit.MINUTES)  // 写入超时（可选）
                .build();

        // 使用 OkHttpClient 创建 RestTemplate
        RestTemplate restTemplate = new RestTemplate();
        restTemplate.setRequestFactory(new OkHttp3ClientHttpRequestFactory(okHttpClient));

        return restTemplate;
    }

    private static JSONArray extractTypoPositions(String fileContent,String inputText) {
        // 记录开始时间
        long startTime = System.currentTimeMillis();
        JSONArray errors = new JSONArray();

        /*String target = "拟好";*/

        List<String> result = new ArrayList<>();
        // 正则表达式匹配双引号内的内容
        String regex = "《(.*?)》";
        Pattern pattern = Pattern.compile(regex);
        Matcher matcher = pattern.matcher(inputText);

        while (matcher.find()) {
            result.add(matcher.group(1));
        }

        int startIndex = 0;
        System.out.println("result错别字：："+result.toString());
        for (int i = 0; i < result.size(); i++) {
            while (true) {
                startIndex = fileContent.indexOf(result.get(i), startIndex);
                if (startIndex == -1) break;

                int endIndex = startIndex + result.get(i).length();

                // 构建错别字位置对象
                JSONObject error = new JSONObject();
                error.put("start", startIndex);
                error.put("end", endIndex);

                // 添加到 errors 数组
                errors.add(error);

                startIndex = endIndex;
                // 继续查找下一个匹配
            }
        }


        return errors;
    }

}
